package org.liuqm;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class MainTest {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
//        UserEntity userEntity = new UserEntity();
//        userEntity.setUserName("李四");
        //1、获得Class实例
        //当我们只知道类名时候
//        Class clazz = UserEntity.class;
//        //当我们有类的实例对象的时候
//        clazz=userEntity.getClass();
//        //当我们需要反射的类不在当前项目时  类的全路径
//        try {
            Class  clazz=Class.forName("org.liuqm.UserEntity");
//        } catch (ClassNotFoundException e) {
//            throw new ClassNotFoundException("org.liuqm.UserEntity 不存在！");
//        }
        //通过Classs实例获取类的信息
//        System.out.println("获取类名："+clazz.getName());
//        System.out.println("获取类名："+clazz.getSimpleName());
//        System.out.println("获取类名："+ clazz.getCanonicalName());
//        System.out.println("获取类名："+ clazz.getTypeName());
//        System.out.println("获取类名："+clazz.toGenericString());
//
//
//
//        //获取类属性
//        Arrays.stream(clazz.getDeclaredFields()).forEach(field -> {
//
//
//            System.out.println("getDeclaredFields属性名称："+field.getName());
//        });



        //1、给属性赋值
//        try {
//            Field field= clazz.getDeclaredField("userName") ;
//            field.setAccessible(true);//不管访问修饰符都可以直接操作 ； 破坏了类的封装性
//
//            System.out.println("userNameValue:"+field.get(userEntity));
//            field.set(userEntity,"张三");
//            System.out.println("userNameNewValue:"+field.get(userEntity));
//        } catch (NoSuchFieldException e) {
//            throw new RuntimeException(e);
//        } catch (IllegalAccessException e) {
//            throw new RuntimeException(e);
//        }
//
//

//
//        //获取类属性
//        Arrays.stream(clazz.getFields()).forEach(field -> {
//            System.out.println("getFields属性名称："+field.getName());
//        });



        //获取类方法
//        Arrays.stream(clazz.getMethods()).forEach(method -> {
//
//            if(method.getName().equals("setUserName")){
//
//                System.out.println("setUserName:"+method.getName());
//            }
//
//
//
//        });
//        没有实例时，需要通过Class实例创建类的实例对象
        //调用类的构造方法进行实例化
//        UserEntity userEntity=new UserEntity();
//        UserEntity userEntity=new UserEntity("","");
       Constructor constructor= clazz.getConstructor();
        //通过无参构造方法进行实例化
       Object o=constructor.newInstance();

//        clazz.getConstructor(String.class,String.class);




        //方法的操作
        Method getUserName=clazz.getMethod("getUserName");

        System.out.println("userNameValue:"+getUserName.invoke(o));
        Method setUserName=clazz.getMethod("setUserName",String.class);
        setUserName.invoke(o,"王五");


        System.out.println("userNameNewValue:"+getUserName.invoke(o));







    }
}
